package com.v2.k15;


import org.springframework.util.MethodInvoker;

import java.util.ArrayList;
import java.util.List;

/**
 * 测试推断构造 的得分
 */
public class Test {

//	假设bean的类型为A，A的父类是B，B的父类是C，同时A实现了接口D：
//	如果构造方法的参数类型为A，那么完全匹配，得分为0；
//	如果构造方法的参数类型为B，那么得分为2；
//	如果构造方法的参数类型为C，那么得分为4；
//	如果构造方法的参数类型为D，那么得分为1。
	public static void main(String[] args) {

		Object[] objects = new Object[]{new A()};

		//可以把？看成所有类型的父类。是一种真实的类型。    这里要看下java泛型 2021年5月30日16:29:04
		//https://blog.csdn.net/w405722907/article/details/80595032
		//因为Class里面不知道存的什么类型   我猜的也不是很理解  2021年5月31日11:54:58
		//说白了就是写成T就是将类型固定，而?则不固定
		System.out.println(MethodInvoker.getTypeDifferenceWeight(new Class<?>[]{A.class}, objects));
		System.out.println(MethodInvoker.getTypeDifferenceWeight(new Class<?>[]{B.class}, objects));
		System.out.println(MethodInvoker.getTypeDifferenceWeight(new Class<?>[]{C.class}, objects));
		System.out.println(MethodInvoker.getTypeDifferenceWeight(new Class<?>[]{D.class}, objects));
//		0
//		2
//		4
//		1
		System.out.println("======");
		System.out.println(A.class);
		System.out.println(B.class);
		System.out.println(C.class);
		System.out.println(D.class);
//		class com.v2.k15.A
//		class com.v2.k15.B
//		class com.v2.k15.C
//		interface com.v2.k15.D

		List<String> aa = new ArrayList<String>();
		aa.add("1");
		aa.add("88");
		System.out.println(aa);

	}
}
